package com.jobs.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;


@EnableAsync
@Configuration
public class ThreadPoolConfig {

    @Bean("chongqingDataExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程池大小
        executor.setCorePoolSize(20);
        //最大线程数
        executor.setMaxPoolSize(50);
        //队列容量
        executor.setQueueCapacity(Integer.MAX_VALUE);
        //活跃时间
        executor.setKeepAliveSeconds(60);
        //线程名字前缀
        executor.setThreadNamePrefix("chongqingDataExecutor-");
        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候，该策略会直接在 execute 方法的调用线程中运行被拒绝的任务；如果执行程序已关闭，则会丢弃该任务
       // executor.setRejectedExecutionHandler(new ThreadPoolExecutor().CallerRunsPolicy());
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

       // @Bean("chongqingDataExecutor")
        public Executor chongqingDataExecutor() {
            // 创建一个线程池对象
            ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
            // 定义一个线程池大小
            scheduler.setPoolSize(100);
            // 线程池名的前缀
            scheduler.setThreadNamePrefix("chongqingDataExecutor-");
            //核心线程池大小
//            scheduler.setCorePoolSize(config.getCorePoolSize());
//            //最大线程数
//            scheduler.setMaxPoolSize(config.getMaxPoolSize());
//            //队列容量
//            scheduler.setQueueCapacity(config.getQueueCapacity());
//            //活跃时间
//            scheduler.setKeepAliveSeconds(config.getKeepAliveSeconds());
            // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
            scheduler.setWaitForTasksToCompleteOnShutdown(true);
            // 设置线程池中任务的等待时间，如果超过这个时候还没有销毁就强制销毁，以确保应用最后能够被关闭，而不是阻塞住
            scheduler.setAwaitTerminationSeconds(60);
            // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候，该策略会直接在 execute 方法的调用线程中运行被拒绝的任务；如果执行程序已关闭，则会丢弃该任务
            scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return scheduler;
        }

    }
